home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / modex100.zip / TEST5.BAS < prev    next >
BASIC Source File  |  1993-05-07  |  13KB  |  573 lines

  1. DECLARE SUB LOAD.SHAPES ()
  2. DECLARE SUB COPY.DEMO ()
  3. DECLARE SUB LOAD.SHIP ()
  4. DECLARE SUB PAGE.DEMO ()
  5. DECLARE FUNCTION GET.KEY% ()
  6. DECLARE SUB DEMO.RES (Mode%, Xmax%, Ymax%)
  7. DECLARE SUB ERROR.OUT (Message$)
  8. DECLARE SUB TPRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%)
  9. DECLARE SUB PRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%, ColorB%)
  10. DEFINT A-Z
  11.  
  12.  
  13. TYPE ShapeType
  14.     ImgData AS STRING * 512
  15.     xWidth  AS INTEGER
  16.     yWidth  AS INTEGER
  17. END TYPE
  18.  
  19. TYPE Sprite
  20.     Xpos    AS INTEGER
  21.     Ypos    AS INTEGER
  22.     XDir    AS INTEGER
  23.     YDir    AS INTEGER
  24.     Shape   AS INTEGER
  25.     LastX(1) AS INTEGER
  26.     LastY(1) AS INTEGER
  27. END TYPE
  28.  
  29.  
  30. CONST MaxShapes = 32
  31.  
  32.     REM $INCLUDE: 'UTILS.BI'
  33.     REM $INCLUDE: 'MODEX.BI'
  34.  
  35. DIM SHARED Img(32) AS ShapeType
  36. COMMON SHARED Img() AS ShapeType
  37.  
  38.  
  39.     CALL INIT.RANDOM
  40.  
  41.     CALL LOAD.SHAPES
  42.  
  43.     CALL DEMO.RES(Mode320x200, 320, 200)
  44.     CALL DEMO.RES(Mode320x400, 320, 400)
  45.  
  46.     CALL DEMO.RES(Mode360x200, 360, 200)
  47.     CALL DEMO.RES(Mode360x400, 360, 400)
  48.  
  49.     CALL DEMO.RES(Mode320x240, 320, 240)
  50.     CALL DEMO.RES(Mode320x480, 320, 480)
  51.  
  52.     CALL DEMO.RES(Mode360x240, 360, 240)
  53.     CALL DEMO.RES(Mode360x480, 360, 480)
  54.  
  55.     CALL PAGE.DEMO
  56.  
  57.     SET.VIDEO.MODE 3
  58.     DOS.PRINT "THIS MODE X DEMO IS FINISHED"
  59.     END
  60.  
  61. SUB DEMO.RES (Mode, Xmax, Ymax)
  62.  
  63.     IF SET.MODEX%(Mode) = 0 THEN
  64.         ERROR.OUT "Unable to SET_MODEX" + STR$(Mode)
  65.     END IF
  66.  
  67.     XCenter = Xmax \ 2
  68.     
  69.     X1 = 10
  70.     Y1 = 10
  71.     X2 = Xmax - 1
  72.     Y2 = Ymax - 1
  73.  
  74.     FOR Z = 0 TO 3
  75.         Colr = 31 - Z * 2
  76.         DRAW.LINE X1 + Z, Y1 + Z, X2 - Z, Y1 + Z, Colr
  77.         DRAW.LINE X1 + Z, Y1 + Z, X1 + Z, Y2 - Z, Colr
  78.         DRAW.LINE X1 + Z, Y2 - Z, X2 - Z, Y2 - Z, Colr
  79.         DRAW.LINE X2 - Z, Y1 + Z, X2 - Z, Y2 - Z, Colr
  80.     NEXT Z
  81.  
  82.     XChars = Xmax \ 10
  83.     YChars = Ymax \ 10
  84.  
  85.     FOR X = 0 TO XChars - 1
  86.         TGPRINTC 48 + ((X + 1) MOD 10), X * 10 + 1, 1, 9 + ((X \ 8) MOD 7)
  87.         DRAW.LINE X * 10 + 9, 0, X * 10 + 9, 3, 15
  88.     NEXT X
  89.  
  90.     FOR Y = 0 TO YChars - 1
  91.         TGPRINTC 48 + ((Y + 1) MOD 10), 1, Y * 10 + 1, 9 + ((Y \ 10) MOD 7)
  92.         DRAW.LINE 0, Y * 10 + 9, 3, Y * 10 + 9, 15
  93.     NEXT Y
  94.  
  95.     ' Draw Lines
  96.  
  97.     FOR X = 0 TO 63
  98.         N = 15 + X * .75
  99.         SET.DAC.REGISTER 64 + X, N, N, N
  100.         SET.DAC.REGISTER 128 + X, 0, N, N
  101.  
  102.         DRAW.LINE 103 - X, 60, 40 + X, 123, 64 + X
  103.         DRAW.LINE 40, 60 + X, 103, 123 - X, 128 + X
  104.  
  105.     NEXT X
  106.     TPRINT.TEXT "LINE TEST", 37, 130, c.BLUE
  107.  
  108.     Y = 60: Gap = 0
  109.     FOR X = 0 TO 9
  110.         FILL.BLOCK 120, Y, 120 + X, Y + Gap, 64 + X
  111.         FILL.BLOCK 140 - (15 - X), Y, 150 + X, Y + Gap, 230 + X
  112.         FILL.BLOCK 170 - (15 - X), Y, 170, Y + Gap, 128 + X
  113.         Y = Y + Gap + 2
  114.         Gap = Gap + 1
  115.     NEXT X
  116.     TPRINT.TEXT "FILL TEST", 110, 46, c.GREEN
  117.  
  118.  
  119.     FOR X = 190 TO 250 STEP 2
  120.        FOR Y = 60 TO 122 STEP 2
  121.           SET.POINT X, Y, X + Y + X + Y
  122.        NEXT Y
  123.     NEXT X
  124.  
  125.     TPRINT.TEXT "PIXEL TEST", 182, 130, c.RED
  126.  
  127.     FOR X = 190 TO 250 STEP 2
  128.        FOR Y = 60 TO 122 STEP 2
  129.           IF READ.POINT(X, Y) <> ((X + Y + X + Y) AND 255) THEN
  130.              ERROR.OUT "READ.PIXEL Failure"
  131.           END IF
  132.        NEXT Y
  133.     NEXT X
  134.  
  135.  
  136.  
  137.     Msg$ = " This is a MODE X demo "
  138.     PRINT.TEXT Msg$, XCenter - (LEN(Msg$) * 4), 20, c.bRED, c.BLUE
  139.     Msg$ = "Screen Resolution is     by    "
  140.     Xp = XCenter - (LEN(Msg$) * 4)
  141.     PRINT.TEXT Msg$, Xp, 30, c.bGREEN, c.BLACK
  142.  
  143.     PRINT.TEXT LTRIM$(STR$(Xmax)), Xp + 8 * 21, 30, c.bPURPLE, c.BLACK
  144.     PRINT.TEXT LTRIM$(STR$(Ymax)), Xp + 8 * 28, 30, c.bWHITE, c.BLACK
  145.  
  146.     FOR X = 0 TO 15
  147.         SET.DAC.REGISTER 230 + X, 63 - X * 4, 0, 15 + X * 3
  148.         DRAW.LINE 30 + X, Ymax - 6 - X, Xmax - 20 - X, Ymax - 6 - X, 230 + X
  149.     NEXT X
  150.     TPRINT.TEXT "Press <ANY KEY> to Continue", XCenter - (26 * 4), Ymax - 18, c.YELLOW
  151.  
  152.     X = GET.KEY%
  153.     IF X = KyESC THEN ERROR.OUT "ABORT"
  154.  
  155. END SUB
  156.  
  157. SUB ERROR.OUT (Message$)
  158.  
  159.     SET.VIDEO.MODE 3
  160.     DOS.PRINT Message$
  161.     END
  162.  
  163. END SUB
  164.  
  165. FUNCTION GET.KEY%
  166.  
  167.     DO
  168.         X = SCAN.KEYBOARD
  169.     LOOP UNTIL X
  170.  
  171.     GET.KEY% = X
  172.  
  173. END FUNCTION
  174.  
  175. SUB LOAD.SHAPES
  176.  
  177. DIM Grid(32, 32)
  178.  
  179.     FOR Shape = 0 TO MaxShapes - 1
  180.  
  181.         ERASE Grid
  182.  
  183.         Style = RANDOM.INT(6)
  184.         Colour = 1 + RANDOM.INT(15)
  185.         
  186.         SELECT CASE Style
  187.  
  188.         CASE 0:         ' Solid Box
  189.  
  190.             DO
  191.                 xWidth = 3 + RANDOM.INT(30)
  192.                 yWidth = 3 + RANDOM.INT(30)
  193.             LOOP UNTIL ((xWidth * yWidth) <= 512)
  194.  
  195.             Img(Shape).xWidth = xWidth
  196.             Img(Shape).yWidth = yWidth
  197.  
  198.             Img(Shape).ImgData = STRING$(xWidth * yWidth, Colour)
  199.  
  200.  
  201.         CASE 1:         ' Hollow Box
  202.  
  203.             DO
  204.                 xWidth = 5 + RANDOM.INT(28)
  205.                 yWidth = 5 + RANDOM.INT(28)
  206.             LOOP UNTIL ((xWidth * yWidth) <= 512)
  207.  
  208.             Img(Shape).xWidth = xWidth
  209.             Img(Shape).yWidth = yWidth
  210.  
  211.             A$ = STRING$(xWidth * yWidth, Colour)
  212.  
  213.             HollowX = 1 + RANDOM.INT(xWidth \ 2 - 1)
  214.             HollowY = 1 + RANDOM.INT(yWidth \ 2 - 1)
  215.  
  216.             FOR Y = HollowY TO yWidth - HollowY - 1
  217.  
  218.                 FOR X = HollowX TO xWidth - HollowX - 1
  219.  
  220.                     MID$(A$, Y * xWidth + X + 1, 1) = CHR$(0)
  221.  
  222.                 NEXT X
  223.             NEXT Y
  224.  
  225.  
  226.  
  227.             Img(Shape).ImgData = A$
  228.             
  229.         CASE 2:         ' Solid Diamond
  230.  
  231.             nWidth = 3 + 2 * RANDOM.INT(10)
  232.             Centre = nWidth \ 2
  233.  
  234.             Img(Shape).xWidth = nWidth
  235.             Img(Shape).yWidth = nWidth
  236.  
  237.             A$ = STRING$(nWidth * nWidth, 0)
  238.  
  239.             FOR Y = 0 TO Centre
  240.                 FOR X = 0 TO Y
  241.                     MID$(A$, Y * nWidth + Centre - X + 1, 1) = CHR$(Colour)
  242.                     MID$(A$, Y * nWidth + Centre + X + 1, 1) = CHR$(Colour)
  243.                     MID$(A$, (nWidth - Y - 1) * nWidth + Centre - X + 1, 1) = CHR$(Colour)
  244.                     MID$(A$, (nWidth - Y - 1) * nWidth + Centre + X + 1, 1) = CHR$(Colour)
  245.                 NEXT X
  246.             NEXT Y
  247.  
  248.             Img(Shape).ImgData = A$
  249.  
  250.  
  251.         CASE 3:         ' Hollow Diamond
  252.  
  253.             nWidth = 3 + 2 * RANDOM.INT(10)
  254.             sWidth = RANDOM.INT(nWidth)
  255.             Centre = nWidth \ 2
  256.  
  257.             Img(Shape).xWidth = nWidth
  258.             Img(Shape).yWidth = nWidth
  259.  
  260.             A$ = STRING$(nWidth * nWidth, 0)
  261.  
  262.             FOR Y = 0 TO Centre
  263.                 S = 0
  264.                 IF Y > sWidth THEN S = Y - sWidth
  265.                 FOR X = S TO Y
  266.                     MID$(A$, Y * nWidth + Centre - X + 1, 1) = CHR$(Colour)
  267.                     MID$(A$, Y * nWidth + Centre + X + 1, 1) = CHR$(Colour)
  268.                     MID$(A$, (nWidth - Y - 1) * nWidth + Centre - X + 1, 1) = CHR$(Colour)
  269.                     MID$(A$, (nWidth - Y - 1) * nWidth + Centre + X + 1, 1) = CHR$(Colour)
  270.                 NEXT X
  271.             NEXT Y
  272.  
  273.             Img(Shape).ImgData = A$
  274.  
  275.         CASE 4:         ' Ball
  276.  
  277.             nWidth = 7 + 2 * RANDOM.INT(8)
  278.             Centre = nWidth \ 2
  279.  
  280.             Img(Shape).xWidth = nWidth
  281.             Img(Shape).yWidth = nWidth
  282.  
  283.             A$ = STRING$(nWidth * nWidth, 0)
  284.  
  285.             FOR Y = 0 TO nWidth
  286.                 FOR X = 0 TO nWidth
  287.                     D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y)))
  288.                     IF D <= Centre THEN
  289.                         MID$(A$, Y * nWidth + X + 1, 1) = CHR$(150 + Colour * 2 + D * 3)
  290.                     END IF
  291.                 NEXT X
  292.             NEXT Y
  293.  
  294.             Img(Shape).ImgData = A$
  295.  
  296.         CASE 5:         ' Ball
  297.  
  298.             nWidth = 7 + 2 * RANDOM.INT(8)
  299.             sWidth = RANDOM.INT(nWidth)
  300.             Centre = nWidth \ 2
  301.  
  302.             Img(Shape).xWidth = nWidth
  303.             Img(Shape).yWidth = nWidth
  304.  
  305.             A$ = STRING$(nWidth * nWidth, 0)
  306.  
  307.             FOR Y = 0 TO nWidth
  308.                 FOR X = 0 TO nWidth
  309.                     D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y)))
  310.                     IF D <= Centre AND D >= sWidth THEN
  311.                         MID$(A$, Y * nWidth + X + 1, 1) = CHR$(150 + Colour * 2 + D * 3)
  312.                     END IF
  313.                 NEXT X
  314.             NEXT Y
  315.  
  316.             Img(Shape).ImgData = A$
  317.         END SELECT
  318.  
  319.     NEXT Shape
  320.  
  321. END SUB
  322.  
  323. SUB PAGE.DEMO
  324.  
  325. CONST MaxSprites = 64
  326.  
  327. DIM Obj(MaxSprites) AS Sprite
  328. DIM LastObjects(1)
  329.  
  330.     ScreenX = 360: ScreenY = 240
  331.  
  332.     IF SET.VGA.MODEX%(Mode320x200, ScreenX, ScreenY, 3) = 0 THEN
  333.         ERROR.OUT "Unable to SET_VGA_MODEX" + STR$(Mode)
  334.     END IF
  335.  
  336.     SET.ACTIVE.PAGE 0
  337.  
  338.     CLEAR.VGA.SCREEN c.BLACK
  339.                
  340.     PRINT.TEXT "This is a Test of the Following Functions:", 10, 9, c.bWHITE, c.BLACK
  341.  
  342.     DRAW.LINE 10, 18, 350, 18, c.YELLOW
  343.     PRINT.TEXT "SET_ACTIVE_PAGE", 10, 20, c.bBLUE, c.BLACK
  344.     PRINT.TEXT "SET_DISPLAY_PAGE", 10, 30, c.GREEN, c.BLACK
  345.     PRINT.TEXT "SET_DAC_REGISTER", 10, 40, c.RED, c.BLACK
  346.     PRINT.TEXT "CLEAR_VGA_SCREEN", 10, 50, c.CYAN, c.BLACK
  347.  
  348.     PRINT.TEXT "TDRAW_BITMAP", 10, 60, c.PURPLE, c.BLACK
  349.     PRINT.TEXT "COPY_PAGE", 10, 70, c.GREEN, c.BLACK
  350.     PRINT.TEXT "COPY_BITMAP", 10, 80, c.CYAN, c.BLACK
  351.  
  352.     PRINT.TEXT "GPRINTC", 10, 90, c.BLUE, c.BLACK
  353.     PRINT.TEXT "TGPRINTC", 10, 100, c.GREEN, c.BLACK
  354.     PRINT.TEXT "SYNC_DISPLAY", 10, 110, c.RED, c.BLACK
  355.     PRINT.TEXT "SET_WINDOW", 10, 120, c.PURPLE, c.BACK
  356.  
  357.     PRINT.TEXT "VIRTUAL SCREEN SIZES", 190, 20, c.bBLUE, c.BLACK
  358.     PRINT.TEXT "    SMOOTH SCROLLING", 190, 30, c.GREEN, c.BLACK
  359.     PRINT.TEXT "    SPRITE ANIMATION", 190, 40, c.CYAN, c.BLACK
  360.     PRINT.TEXT "       PAGE FLIPPING", 190, 50, c.RED, c.BLACK
  361.     PRINT.TEXT "       COLOR CYCLING", 190, 60, c.PURPLE, c.BLACK
  362.  
  363.  
  364.     FOR X = 0 TO 60
  365.         SET.DAC.REGISTER 50 + X, 3 + X, 0, 60 - X
  366.         SET.DAC.REGISTER 150 + X, 3 + X, 0, 60 - X
  367.     NEXT X
  368.  
  369.     c = 0: DC = 1
  370.     FOR X = 0 TO ScreenX \ 2
  371.         DRAW.LINE ScreenX \ 2 - 1, ScreenY \ 4, X, ScreenY - 1, c + 50
  372.         DRAW.LINE ScreenX \ 2, ScreenY \ 4, ScreenX - X - 1, ScreenY - 1, c + 50
  373.         c = c + DC
  374.         IF c = 0 OR c = 60 THEN DC = -DC
  375.     NEXT X
  376.                 
  377.     TPRINT.TEXT "Press <ANY KEY> to Continue", 72, 190, c.bWHITE
  378.     TPRINT.TEXT "< > = Faster   < > = Slower", 72, 204, c.bGREEN
  379.     TPRINT.TEXT "< > = Fewer Shapes  < > = More Shapes", 32, 218, c.bCYAN
  380.  
  381.     TGPRINTC 43, 80, 204, c.YELLOW
  382.     TGPRINTC 45, 200, 204, c.YELLOW
  383.  
  384.     TGPRINTC 25, 40, 218, c.YELLOW
  385.     TGPRINTC 24, 200, 218, c.YELLOW
  386.  
  387.     COPY.PAGE 0, 1
  388.     COPY.PAGE 0, 2
  389.  
  390.     FOR X = 1 TO MaxSprites
  391.         DO
  392.             Obj(X).XDir = RANDOM.INT(7) - 3
  393.             Obj(X).YDir = RANDOM.INT(7) - 3
  394.         LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
  395.  
  396.         Obj(X).Shape = X MOD MaxShapes
  397.  
  398.         SpriteX = Img(Obj(X).Shape).xWidth
  399.         SpriteY = Img(Obj(X).Shape).yWidth
  400.  
  401.         Obj(X).Xpos = 1 + RANDOM.INT(ScreenX - SpriteX - 2)
  402.         Obj(X).Ypos = 1 + RANDOM.INT(ScreenY - SpriteY - 2)
  403.  
  404.         Obj(X).LastX(0) = Obj(X).Xpos
  405.         Obj(X).LastX(1) = Obj(X).Xpos
  406.         Obj(X).LastY(0) = Obj(X).Ypos
  407.         Obj(X).LastY(1) = Obj(X).Ypos
  408.     NEXT X
  409.  
  410.     CurrentPage = 0
  411.  
  412.     'View Shift...
  413.  
  414.     ViewX = 0
  415.     ViewY = 0
  416.     ViewMax = 3
  417.     ViewCnt = 0
  418.     ViewXD = 1
  419.     ViewYD = 1
  420.  
  421.     SetColor = 3: SDir = 1
  422.     PrevColor = 0: PDir = 1
  423.  
  424.     VisObjects = MaxSprites \ 2
  425.     LastObjects(0) = 0
  426.     LastObjects(1) = 0
  427.  
  428. DRAW.LOOP:
  429.  
  430.  
  431.     SET.ACTIVE.PAGE CurrentPage
  432.  
  433.     ' Erase Old Images
  434.  
  435.     FOR X = 1 TO LastObjects(CurrentPage)
  436.     
  437.         X1 = Obj(X).LastX(CurrentPage) AND &HFFFC
  438.         Y1 = Obj(X).LastY(CurrentPage)
  439.         X2 = ((Obj(X).LastX(CurrentPage) + Img(Obj(X).Shape).xWidth)) OR 3
  440.         Y2 = Y1 + Img(Obj(X).Shape).yWidth - 1
  441.  
  442.         COPY.BITMAP 2, X1, Y1, X2, Y2, CurrentPage, X1, Y1
  443.     
  444.     NEXT X
  445.  
  446.     ' Draw new images
  447.  
  448.     FOR X = 1 TO VisObjects
  449.  
  450.         SpriteX = Img(Obj(X).Shape).xWidth
  451.         SpriteY = Img(Obj(X).Shape).yWidth
  452.  
  453.         ' Move Sprite
  454.  
  455. REDOX:
  456.         NewX = Obj(X).Xpos + Obj(X).XDir
  457.         IF NewX < 0 OR NewX + SpriteX > ScreenX THEN
  458.             Obj(X).XDir = -Obj(X).XDir
  459.             IF RANDOM.INT(20) = 1 THEN
  460.                 DO
  461.                     Obj(X).XDir = RANDOM.INT(7) - 3
  462.                     Obj(X).YDir = RANDOM.INT(7) - 3
  463.                 LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
  464.                 GOTO REDOX
  465.             END IF
  466.         END IF
  467.         Obj(X).Xpos = Obj(X).Xpos + Obj(X).XDir
  468.  
  469. REDOY:
  470.         NewY = Obj(X).Ypos + Obj(X).YDir
  471.         IF NewY < 0 OR NewY + SpriteY > ScreenY THEN
  472.             Obj(X).YDir = -Obj(X).YDir
  473.             IF RANDOM.INT(20) = 1 THEN
  474.                 DO
  475.                     Obj(X).XDir = RANDOM.INT(7) - 3
  476.                     Obj(X).YDir = RANDOM.INT(7) - 3
  477.                 LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
  478.                 GOTO REDOY
  479.             END IF
  480.         END IF
  481.         Obj(X).Ypos = Obj(X).Ypos + Obj(X).YDir
  482.  
  483.         'Draw Sprite
  484.  
  485.         TDRAW.BITMAP Img(Obj(X).Shape), Obj(X).Xpos, Obj(X).Ypos, SpriteX, SpriteY
  486.  
  487.         Obj(X).LastX(CurrentPage) = Obj(X).Xpos
  488.         Obj(X).LastY(CurrentPage) = Obj(X).Ypos
  489.  
  490.     NEXT X
  491.  
  492.     LastObjects(CurrentPage) = VisObjects
  493.  
  494.     ' Pan Screen Back & Forth
  495.  
  496.     ViewCnt = ViewCnt + 1
  497.     IF ViewCnt >= ViewMax THEN
  498.         ViewX = ViewX + ViewXD
  499.         IF ViewX = 0 OR ViewX = 39 THEN ViewXD = -ViewXD
  500.         IF ViewXD < 0 THEN
  501.             ViewY = ViewY + ViewYD
  502.             IF ViewY = 0 OR ViewY = 39 THEN ViewYD = -ViewYD
  503.         END IF
  504.    
  505.         SET.WINDOW CurrentPage, ViewX, ViewY
  506.  
  507.         ViewCnt = 0
  508.     ELSE
  509.         SET.DISPLAY.PAGE CurrentPage
  510.     END IF
  511.  
  512.     ' Cycle Colors
  513.  
  514.     SET.DAC.REGISTER 50 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor
  515.     SET.DAC.REGISTER 50 + SetColor, SetColor, 10, 63 - SetColor
  516.  
  517.     SET.DAC.REGISTER 150 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor
  518.     SET.DAC.REGISTER 150 + SetColor, 63, 63, SetColor
  519.  
  520.     SetColor = SetColor + SDir
  521.     IF SetColor = 60 OR SetColor = 0 THEN SDir = -SDir
  522.  
  523.     PrevColor = PrevColor + PDir
  524.     IF PrevColor = 60 OR PrevColor = 0 THEN PDir = -PDir
  525.  
  526.     CurrentPage = 1 - CurrentPage
  527.  
  528.     Code = SCAN.KEYBOARD
  529.  
  530.     IF Code = False THEN GOTO DRAW.LOOP
  531.  
  532.     IF Code = KyPlus THEN
  533.         IF ViewMax < 12 THEN ViewMax = ViewMax + 1
  534.         GOTO DRAW.LOOP
  535.     END IF
  536.  
  537.     IF Code = KyMinus THEN
  538.         IF ViewMax > 1 THEN ViewMax = ViewMax - 1
  539.         IF ViewCnt >= ViewMax THEN ViewCnt = 0
  540.         GOTO DRAW.LOOP
  541.     END IF
  542.  
  543.     IF Code = KyUp THEN
  544.         IF VisObjects < MaxSprites THEN VisObjects = VisObjects + 1
  545.         GOTO DRAW.LOOP
  546.     END IF
  547.         
  548.     IF Code = KyDown THEN
  549.         IF VisObjects > 1 THEN VisObjects = VisObjects - 1
  550.         GOTO DRAW.LOOP
  551.     END IF
  552.  
  553.  
  554. END SUB
  555.  
  556. SUB PRINT.TEXT (Text$, Xpos, Ypos, ColorF, ColorB)
  557.  
  558.     IF LEN(Text$) = 0 THEN EXIT SUB
  559.  
  560.     PRINT.STR SSEG(Text$), SADD(Text$), LEN(Text$), Xpos, Ypos, ColorF, ColorB
  561.  
  562.  
  563. END SUB
  564.  
  565. SUB TPRINT.TEXT (Text$, Xpos, Ypos, ColorF)
  566.  
  567.     IF LEN(Text$) = 0 THEN EXIT SUB
  568.  
  569.     TPRINT.STR SSEG(Text$), SADD(Text$), LEN(Text$), Xpos, Ypos, ColorF
  570.  
  571. END SUB
  572.  
  573.